/*
 * consola.c
 *
 *  Created on: 10/12/2009
 *      Author: teledhil
 */

#include <stdio.h>
#include <stdarg.h>
#include <string.h>
#include <stdlib.h>
#include "comandos.h"
#include "consola.h"
#include "constantes.h"
#include "variablesGlobales.h"

int output_user(char *nick, const char * format, ...) {

	va_list lista_argumentos;

	fprintf(stdout, "<%s> ", nick);
	va_start (lista_argumentos, format);
	vfprintf(stdout, format, lista_argumentos);
	va_end (lista_argumentos);
	fprintf(stdout, "\n");

	return 0;
}

int output_program(const char * format, ...) {

	va_list lista_argumentos;

	fprintf(stdout, "*** ");
	va_start (lista_argumentos, format);
	vfprintf(stdout, format, lista_argumentos);
	va_end (lista_argumentos);
	fprintf(stdout, "\n");

	return 0;
}

int output_me(const char * format, ...) {

	va_list lista_argumentos;

	fprintf(stdout, "> ");
	va_start (lista_argumentos, format);
	vfprintf(stdout, format, lista_argumentos);
	va_end (lista_argumentos);
	fprintf(stdout, "\n");

	return 0;
}

int output_debug(const char * format, ...) {

	va_list lista_argumentos;

	if (debugMode) {
		fprintf(stdout, "DDD ");
		va_start (lista_argumentos, format);
		vfprintf(stdout, format, lista_argumentos);
		va_end (lista_argumentos);
		fprintf(stdout, "\n");
	}

	return 0;
}

int output_error(const char * format, ...) {

	va_list lista_argumentos;

	fprintf(stderr, "ERROR ");
	va_start (lista_argumentos, format);
	vfprintf(stderr, format, lista_argumentos);
	va_end (lista_argumentos);
	fprintf(stderr, "\n");

	return 0;
}

int consola_leer_linea(char *linea, FILE *stream) {
	/*Devuelve: numero de caracteres leidos*/

	char *fin_linea;

	/*Obtiene una linea de stream*/
	if (fgets(linea, MAX_LONG_LINEA_CONSOLA, stream)) {
		/*Busca caracteres fin de linea y los sustituye por espacios*/
		fin_linea = strchr(linea, '\n');
		while (fin_linea) {
			*fin_linea = ' ';
			fin_linea = strchr(linea, '\n');
		}
	}

	output_debug("leer_linea Linea: |%s|%d", linea, (int) strlen(linea));

	return (int) strlen(linea);
}

int consola_sacar_argumentos(char *linea, char **argv[]) {
	/*Devuelve: numero de argumentos leidos*/

	int num_argumentos = 0;
	/*char argumento[MAX_LONG_LINEA]="";
	 int offset=0;*/
	char *argumento;
	static char espacios[] = " \f\n\r\t\v";
	char *destino;
	char *ptOrigen, *ptDestino;
	char c, d;
	int i = 0;
	char **argumentos;

	/*fprintf(stderr,"@Debug sacar_argumentos Linea: |%s|%d\n",linea,
	 (int)strlen(linea));*/
	/*while ((sscanf(linea+offset, "%s", argumento))>0) {
	 fprintf(stderr,"@Debug sacar_argumentos Argumento: |%s|%d\n",
	 argumento,(int)strlen(argumento));

	 offset+=(int)strlen(argumento)+1;

	 //Vacia leido
	 memset(argumento,'\0',strlen(argumento));
	 num_argumentos++;
	 }*/

	destino = (char *) malloc((strlen(linea) + 1) * sizeof(char));
	if (destino == NULL) {
		fprintf(stderr, "Error en malloc destino\n");
		return -1;
	}

	//Copia los argumentos en un nuevo vector
	for (num_argumentos = 1, ptOrigen = linea, ptDestino = destino; (c
			= *ptOrigen); ptOrigen++, ptDestino++) {

		if (strchr(espacios, c)) {
			if (d != '\0') {
				num_argumentos++;
			}
			c = '\0';
		}
		d = c;
		*ptDestino = c;
	}
	*ptDestino = '\0';

	argumentos = (char **) malloc((num_argumentos + 1) * sizeof(char *));
	if (argumentos == NULL) {
		fprintf(stderr, "Error en malloc argumentos\n");
		return -1;
	}

	for (i = 0, ptOrigen = destino; ptOrigen < ptDestino; ptOrigen += (strlen(
			ptOrigen) + 1)) {

		if (*ptOrigen == '\0') {
			continue;
		}
		argumento = (char *) malloc((strlen(ptOrigen) + 1) * sizeof(char));
		strcpy(argumento, ptOrigen);
		argumentos[i] = argumento;
		i++;
		/*fprintf(stderr,"@Debug sacar_argumentos Argumento: |%s|%d\n",
		 argumento,(int)strlen(argumento));*/
	}
	argumentos[i] = NULL;

	/*i=0;
	 while(argumentos[i]!=NULL) {
	 fprintf(stderr,"@Debug sacar_argumentos Argumento (%d): |%s|\n",i+1,
	 argumentos[i]);
	 i++;
	 }*/

	/*Libera el vector destino*/
	free(destino);

	*argv = argumentos;

	return num_argumentos - 1;

}

/*int consola_eval(char *argumentos[], int eval) {
 //Devuelve: 0 si exit
 int i = 0;

 //fprintf(stderr, "@Debug eval Argumentos: %d\n", eval);
 while (argumentos[i] != NULL) {
 //	fprintf(stderr, "@Debug eval Argumento (%d): |%s|\n", i + 1, argumentos[i]);
 i++;
 }

 if (argumentos[0] != NULL) {
 //FIND [keyword]
 if ((strcmp("find", argumentos[0]) == 0)) {
 //	fprintf(stderr, "FIND!\n");
 if (argumentos[1] != NULL) {
 r_find(argumentos[1]);
 }

 //GET [ID]
 } else if ((strcmp("get", argumentos[0]) == 0)) {
 //	fprintf(stderr, "GET!\n");
 i = 1;
 while (argumentos[i] != NULL) {
 r_get(atoi(argumentos[i]));
 i++;
 }

 //INFO [value]
 } else if ((strcmp("info", argumentos[0]) == 0)) {
 //	fprintf(stderr, "INFO!\n");
 if (argumentos[1] != NULL) {
 i = 1;
 while (argumentos[i] != NULL) {
 //uploads
 if ((strcmp("uploads", argumentos[i]) == 0)) {
 /_info( INFO_UPLOADS);
 //downloads
 } else if ((strcmp("downloads", argumentos[i]) == 0)) {
 r_info( INFO_DOWNLOADS);
 //hosts
 } else if ((strcmp("hosts", argumentos[i]) == 0)) {
 r_info( INFO_HOSTS);
 } else {
 fprintf(stdout, "Opción desconocida\n");
 }
 i++;
 }
 } else {
 //r_info(INFO_ALL);
 r_info( INFO_UPLOADS);
 r_info( INFO_DOWNLOADS);
 r_info( INFO_HOSTS);
 }

 //STOP [ID]
 } else if ((strcmp("stop", argumentos[0]) == 0)) {
 //	fprintf(stderr, "STOP!\n");
 i = 1;
 while (argumentos[i] != NULL) {
 r_stop(atoi(argumentos[i]));
 i++;
 }

 //EXIT
 } else if ((strcmp("exit", argumentos[0]) == 0) || (strcmp("quit",
 argumentos[0]) == 0)) {
 //	fprintf(stderr, "EXIT!\n");
 r_exit();
 return -1;

 //SET [variable] [value]
 } else if ((strcmp("set", argumentos[0]) == 0)) {
 //	fprintf(stderr, "SET!\n");
 if (argumentos[1] != NULL) {
 //rowebcache [url]
 if ((strcmp("rowebcache", argumentos[1]) == 0)) {
 if (argumentos[2] != NULL) {
 r_set_rowebcache(argumentos[2]);
 } else {
 r_show_rowebcache();
 }
 //localport [port]
 } else if ((strcmp("localport", argumentos[1]) == 0)) {
 if (argumentos[2] != NULL) {
 r_set_localport(atoi(argumentos[2]));
 } else {
 r_show_localport();
 }
 //sharepath [path]
 } else if ((strcmp("sharepath", argumentos[1]) == 0)) {
 if (argumentos[2] != NULL) {
 r_set_sharepath(argumentos[2]);
 } else {
 r_show_sharepath();
 }
 //incomingpath [path]
 } else if ((strcmp("incomingpath", argumentos[1]) == 0)) {
 if (argumentos[2] != NULL) {
 r_set_incomingpath(argumentos[2]);
 } else {
 r_show_incomingpath();
 }
 //downloadpath [path]
 } else if ((strcmp("downloadpath", argumentos[1]) == 0)) {
 if (argumentos[2] != NULL) {
 r_set_downloadpath(argumentos[2]);
 } else {
 r_show_downloadpath();
 }

 } else {
 fprintf(stdout, "Variable desconocida\n");
 }
 } else {
 //r_set();
 r_show_rowebcache();
 r_show_localport();
 r_show_sharepath();
 r_show_incomingpath();
 r_show_downloadpath();
 }

 } else {
 fprintf(stdout, "Comando desconocido\n");
 }
 }
 return 0;
 }*/

int evaluar_linea(char *linea) {

	static char espacios[] = " \f\n\r\t\v";
	char *palabra, *ptCaracter;
	bool seguir = true;

	/*Comprueba si la primera palabra es un comando*/
	if ('/' == (*linea)) {

		/*obtiene la primera palabra de la linea*/
		for (ptCaracter = linea; ((*ptCaracter) != '\0') && seguir; ptCaracter++) {
			if (strchr(espacios, *ptCaracter)) {
				seguir = false;
			}
		}
		palabra = (char *) calloc(1, (ptCaracter - linea) * sizeof(char));
		strncat(palabra, linea, ptCaracter - linea - 1);
		output_debug("evaluarLinea. palabra=%s", palabra);

		//Evalua la primera palabra
		if (strcmp(palabra, COMANDO_HELP) == 0) {
			help();
		} else if (strcmp(palabra, COMANDO_CONNECT) == 0) {

		} else if (strcmp(palabra, COMANDO_AUTH) == 0) {
			auth(ptCaracter);
		} else if (strcmp(palabra, COMANDO_LIST) == 0) {
			list();
		} else if (strcmp(palabra, COMANDO_JOIN) == 0) {
			join(ptCaracter);
		} else if (strcmp(palabra, COMANDO_LEAVE) == 0) {
			leave();
		} else if (strcmp(palabra, COMANDO_WHO) == 0) {
			who();
		} else if (strcmp(palabra, COMANDO_MSG) == 0) {
			msg(ptCaracter);
		} else if (strcmp(palabra, COMANDO_DISCONNECT) == 0) {
			disconnect();
		} else if (strcmp(palabra, COMANDO_QUIT) == 0) {
			quit();
		} else if (strcmp(palabra, COMANDO_NOP) == 0) {
			nop(ptCaracter);
		} else if (strcmp(palabra, COMANDO_SLEEP) == 0) {

		} else if (strcmp(palabra, COMANDO_OFFER) == 0) {

		} else if (strcmp(palabra, COMANDO_DOWNLOAD) == 0) {

		} else {
			output_program("Comando %s desconocido",palabra);
		}

		free(palabra);

	} else {
		msg(linea);
	}

	return 0;
}

int bucle_consola() {

	char leido[MAX_LONG_LINEA_CONSOLA] = "";

	/*int num_arg = 0;
	 char **argumentos;*/

	/*fprintf(stdout, "> ");*/
	fflush(stdout);
	while (consola_leer_linea(leido, stdin) > 0) {
		/*num_arg = consola_sacar_argumentos(leido, &argumentos);*/
		evaluar_linea(leido);
		/*if (consola_eval(argumentos, num_arg) < 0) {
		 return 0;
		 }*/
		/*Vacia leido*/
		memset(leido, '\0', strlen(leido));
		/*fprintf(stdout, "> ");*/
		fflush(stdout);
	}
	fprintf(stderr, "Fin lectura comandos. IRCC se cierra\n");
	/*r_exit();*/

	return 0;

}
